﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

using System.Numerics;

using NumDouble = MathNet.Numerics.LinearAlgebra.Double;
using NumComplex = MathNet.Numerics.LinearAlgebra.Complex;

namespace Estimador_EDAL.Interface_View
{
    //1 - Injeção de Potência Real (Pi)
    //2 - Fluxo de Potência Real (Pij)
    //3 - Injeção de Potência Reativa (Qi)
    //4 - Fluxo de Potência Reativa (Qij)
    //5 - Amplitude de Corrente (Iij)
    //6 - Amplitude de Tensão (Vi)
    public enum CDiagramDataType { Empty, Pi, Pij, Qi, Qij, Iij, Vi }

    public class CDiagramData
    {
        private CDiagramDataType m_Tipo;
        private uint m_BarraDE;
        private uint m_BarraPARA;
        private uint m_NumCIRC;
        private int m_Xmed;
        private int m_Ymed;
        private int m_Xest;
        private int m_Yest;

        #region Construção do Objeto

        public CDiagramData()
        {
            Defaults();
        }

        public CDiagramData(CDiagramData data)
        {
            Copy(data);
        }

        public CDiagramData(CDiagramDataType tipo, uint bDE, uint bPARA, uint nCIRC, int xmed, int ymed, int xest, int yest)
        {
            m_Tipo = tipo;
            m_BarraDE = bDE;
            m_BarraPARA = bPARA;
            m_NumCIRC = nCIRC;
            m_Xmed = xmed;
            m_Ymed = ymed;
            m_Xest = xest;
            m_Yest = yest;
        }

        private void Defaults()
        {
            m_Tipo = CDiagramDataType.Empty;
            m_BarraDE = 0;
            m_BarraPARA = 0;
            m_NumCIRC = 0;
            m_Xmed = -1;
            m_Ymed = -1;
            m_Xest = -1;
            m_Yest = -1;
        }

        private void Copy(CDiagramData data)
        {
            m_Tipo = data.m_Tipo;
            m_BarraDE = data.m_BarraDE;
            m_BarraPARA = data.m_BarraPARA;
            m_NumCIRC = data.m_NumCIRC;
            m_Xmed = data.m_Xmed;
            m_Ymed = data.m_Ymed;
            m_Xest = data.m_Xest;
            m_Yest = data.m_Yest;
        }

        #endregion Construção do Objeto

        #region Get's e Set's

        public CDiagramDataType Tipo
        {
            get { return m_Tipo; }
            set { if (!m_Tipo.Equals(value)) m_Tipo = value; }
        }

        public uint BarraDE
        {
            get { return m_BarraDE; }
            set { if (m_BarraDE != value) m_BarraDE = value; }
        }

        public uint BarraPARA
        {
            get { return m_BarraPARA; }
            set { if (m_BarraPARA != value) m_BarraPARA = value; }
        }

        public uint NumCIRC
        {
            get { return m_NumCIRC; }
            set { if (m_NumCIRC != value) m_NumCIRC = value; }
        }

        public int Xmed
        {
            get { return m_Xmed; }
            set { if (m_Xmed != value) m_Xmed = value; }
        }

        public int Ymed
        {
            get { return m_Ymed; }
            set { if (m_Ymed != value) m_Ymed = value; }
        }

        public int Xest
        {
            get { return m_Xest; }
            set { if (m_Xest != value) m_Xest = value; }
        }

        public int Yest
        {
            get { return m_Yest; }
            set { if (m_Yest != value) m_Yest = value; }
        }

        #endregion Get's e Set's

        #region Rotinas Públicas - DE e PARA formato texto

        public void CarregaDeTxt(string str)
        {
            string[] str_Partes = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            //validação
            if (str_Partes.Length < 8)
            {
                System.Diagnostics.Debug.WriteLine("Falha (CDiagramData.CarregaDeTxt): número de colunas menor que o necessário.");
                return;
            }

            //carrega dados
            CultureInfo formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
            try
            {
                m_Tipo = (CDiagramDataType)Enum.Parse(typeof(CDiagramDataType), str_Partes[0]);
                m_BarraDE = uint.Parse(str_Partes[1]);
                m_BarraPARA = uint.Parse(str_Partes[2]);
                m_NumCIRC = uint.Parse(str_Partes[3]);
                m_Xmed = int.Parse(str_Partes[4]);
                m_Ymed = int.Parse(str_Partes[5]);
                m_Xest = int.Parse(str_Partes[6]);
                m_Yest = int.Parse(str_Partes[7]);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Falha (CDiagramData.CarregaDeTxt): " + e.Message);
            }
        }

        public string DescarregaParaTxt()
        {
            string ret = "";
            CultureInfo formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
            ret += m_Tipo.ToString() + " ";
            ret += m_BarraDE + " ";
            ret += m_BarraPARA + " ";
            ret += m_NumCIRC + " ";
            ret += m_Xmed + " ";
            ret += m_Ymed + " ";
            ret += m_Xest + " ";
            ret += m_Yest;
            return ret;
        }

        #endregion Rotinas Públicas - DE e PARA formato texto
    }
}
